package com.dc.toolkit.json_gson;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.junit.Test;

import java.util.*;

/**
 * Description: Gson 测试 Demo
 * @author: gdc
 * @date: 2021/6/8
 * @version 1.0
 */
public class GsonTest {

    private static final Gson GSON = new Gson();

    static final Mouse MOUSE = new Mouse()
            .setName("杰瑞")
            .setAge(12)
            .setSex(1)
            .setBirthday(new Date())
            .setPhone(12345)
            .setMobile(67890);
    static final List<Mouse> MOUSE_LIST = Lists.newArrayList();
    static final Map<String, String> MAP = Maps.newHashMap();
    static {
        for (int i = 0; i < 5; i++) {
            Mouse mouse = new Mouse().setName("杰瑞").setAge(12).setSex(1);
            MOUSE_LIST.add(mouse);
        }

        MAP.put("key1", "1");
        MAP.put("key2", "2");
        MAP.put("key3", "3");
    }

    /**
     *  对象 与 JSON转换
     */
    @Test
	public void test_one() {
		String gsonStr = GSON.toJson(MOUSE);
		System.out.println("对象 转 JSON：" + gsonStr);

		Mouse mouse = GSON.fromJson(gsonStr, Mouse.class);
		System.out.println("\njson 转 对象：" + mouse);
    }

    /**
     *  列表 与 JSON转换
     */
    @Test
    public void test_list() {
        String monseListJson = GSON.toJson(MOUSE_LIST);
        System.out.println("列表 转 JSON：" + monseListJson);

        List<Mouse> list = GSON.fromJson(monseListJson, List.class);
        System.out.println("\nJSON 转 列表：" + list);
    }

    /**
     *  Map 与 JSON转换
     */
    @Test
    public void test_map() {
        String json = GSON.toJson(MAP);
        System.out.println("Map 转 JSON：" + json);

        Map<String, String> map = GSON.fromJson(json, Map.class);
        System.out.println("\nJSON 转 Map：" + map);
    }

    /**
     *
     *	当实体类中，成员变量没有被 @Expose 修饰，或者其修饰参数为 false 时，
     *	通过 调用 Gson GSON = new GsonBuilder()
     *                      	.excludeFieldsWithoutExposeAnnotation()
     *                      	.create();
     *	令 GSON 在序列号或反序列号的字段是否显示功能生效
     */
    @Test
    public void test_Expose() {
        String gsonStr = GSON.toJson(MOUSE);
        System.out.println("【Gson()】对象 转 JSON：" + gsonStr);

        Gson gson = new GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation()			// 使 @Expose 修饰的参数是否显示
                .setDateFormat("yyyy-MM-dd hh:mm:ss") 			// 使用 setDateFormat() 将字段中的日期进行格式化输出
                .setVersion(5.0)								// 设置当前版本
                .setPrettyPrinting()                            // 格式化JSON输出
                .create();

        String json = gson.toJson(MOUSE);
        System.out.println("\n【GsonBuilder()】对象 转 JSON: " + json);
    }
	
}
